package com.cloud_sang.fubai.service;

import cn.hutool.core.util.IdUtil;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;

import java.util.concurrent.TimeUnit;

@Service
public class PaymentService {
	public String paymentInfo_OK(Integer id) {
		return "线程池： " + Thread.currentThread().getName()
				+ "paymentInfo_OK,id:" + id + " 正常访问！O(∩_∩)OO(∩_∩)O";
	}

	/**
	 * 超时访问，演示降级
	 * @param id
	 * @return
	 */
	// TODO :等待处理 springBoot内置的tomcat线程数量为10个，当该接口被压测时，
	//  所有的线程都在处理这个方法，当有用户访问com.cloud_sang.fubai.service.PaymentService#paymentInfo_OK时，
	//  会出现等待的现象
	@HystrixCommand(fallbackMethod = "paymentInfo_TimeoutHandler",commandProperties = {
			@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "5000")
	})
	public String paymentInfo_Timeout(Integer id) {
		int timeNumber = 3;
		try {
			TimeUnit.SECONDS.sleep(timeNumber);
		} catch (Exception e){
			e.printStackTrace();
		}
		return "线程池： " + Thread.currentThread().getName()
				+ "   paymentInfo_OK,id:" + id + " 耗时(秒):" + timeNumber;
	}

	public String paymentInfo_TimeoutHandler(Integer id) {
		return "/(ToT)/调用支付接口超时或异常、\t" + "\t当前线程池名字" + Thread.currentThread().getName();
	}


	// 服务熔断
	@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
			@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),              //是否开启断路器
			@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),    //请求数达到后才计算
			@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //休眠时间窗
			@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),  //错误率达到多少跳闸
	})
	public String paymentCircuitBreaker(@PathVariable("id") Integer id) {
		if(id < 0){
			throw  new RuntimeException("****id 不能为负数");
		}
		String serialNumber = IdUtil.simpleUUID();

		return  Thread.currentThread().getName() + "\t" + "调用成功，流水号：" + serialNumber;
	}

	public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){
		return "id 不能为负数,请稍后再试， o(╥﹏╥)o id: " + id;
	}
}
